package com.wc.fortnight_blue_bridge.Q16模拟一.E_异或运算;

public class Main {
    /**
     * 【问题描述】
     * 两个数按位异或是指将这两个数转换成二进制后，最低位与最低位异或作为结果的最低位，次低位与次低位异或作为结果的次低位，以此类推。
     * 例如，3 与 5 按位异或值为 6 。
     * 小蓝有以下 30 个整数：
     * 9226, 4690, 4873, 1285, 4624, 1596, 6982, 590, 8806, 121, 8399, 8526, 5426, 64, 9655, 7705, 3929, 3588, 7397, 8020, 1311, 5676, 3469, 2325, 1226, 8203, 9524, 3648, 5278, 8647.
     * 小蓝想找一个整数 V ，使得 V 与这 30 个数分别异或后，得到的 30 个数的平方和最小。请问平方和最小是多少？
     * 答案：1070293541
     */
    static int N = 30;
    static int[] a = new int[N];

    public static void main(String[] args) {
        String s = "9226, 4690, 4873, 1285, 4624, 1596, 6982, 590, 8806, 121, 8399, 8526, 5426, 64, 9655, 7705, 3929, 3588, 7397, 8020, 1311, 5676, 3469, 2325, 1226, 8203, 9524, 3648, 5278, 8647";
        String[] split = s.split(", ");
        for (int i = 0; i < N; i++) a[i] = Integer.parseInt(split[i]);
        long minSum = (long) 1e20, res = 0;
        for (int i = 0; i < 1000000; i++){
            long sum = 0;
            for(int j = 0; j < N; j++){
                long x = i ^ a[j];
                sum += x * x;
            }
            if (sum < minSum) {
                minSum = sum;
                res = i;
            }
        }
        System.out.println(res);
        System.out.println(minSum);
    }
}
